package beans;

import pool.*;
import java.util.*;
import java.sql.*;

/**
 * @author Antonin Mozzati
 * @author Yannick Schürter
 */
public class ListeUtilisateur {


    private ArrayList<UtilisateurBean> listeUtilisateurs;
    JDCConnectionDriver driver;
    Connection connexion;
    
    public ListeUtilisateur(JDCConnectionDriver driver) throws Exception  {
        this.driver = driver;
    }
    
    // retourne la liste des utlisateurs actuellement dans la base
    public ArrayList<UtilisateurBean> getListeUtilisateurs() {
	PreparedStatement ps;
	listeUtilisateurs = new ArrayList<UtilisateurBean>();
	try {
            this.connexion = driver.connect("jdbc:jdc:jdcpool", null);

	    ps = connexion.prepareStatement("SELECT id_utilisateur, groupeUtilisateur, loginUtilisateur,"
		    + " nomUtilisateur, prenomUtilisateur, mailutilisateur, mdpUtilisateur,"
		    + " dateInscription FROM app.utilisateurs");
	    ResultSet rs = ps.executeQuery();
	    while (rs.next()) {
		UtilisateurBean util = new UtilisateurBean(
			new Integer(rs.getString(1)),
			new Integer(rs.getString(2)),
			rs.getString(3),
			rs.getString(4),
			rs.getString(5),
			rs.getString(6),
			rs.getString(7),
			rs.getString(8));
		listeUtilisateurs.add(util);
	    }
	    ps.close();

	} catch (Exception e) {
	    System.err.println("Pb fermeture: " + e.getMessage());
	    e.printStackTrace();
	}
	return listeUtilisateurs;
    }

    public int addUtilisateur(UtilisateurBean ub) {
	try {
            this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
            PreparedStatement ps;
            System.out.println("Ajout de "+ub.getLogin());
            ps = connexion.prepareStatement("Insert into app.utilisateurs (groupeUtilisateur, loginUtilisateur, nomUtilisateur,  prenomUtilisateur, mailUtilisateur, mdpUtilisateur, dateInscription) VALUES ("
                    +ub.getGroupeUtilisateur()+", "
                    +"'"+ub.getLogin()+"', "
                    +"'"+ub.getNom().replace("'", "''")+"', "
                    +"'"+ub.getPrenom().replace("'", "''")+"', "
                    +"'"+ub.getMail().replace("'", "''")+"', "
                    +"'"+ub.getMdp()+"', "
                    +"'"+ub.getDateInscription()+"')"
                    , Statement.RETURN_GENERATED_KEYS);
            ps.executeUpdate();

            // Récupération de l'id de l'utilisateur générée à l'insertion
            ResultSet keys = ps.getGeneratedKeys();
            keys.next();  
            int insertID = keys.getInt(1);

            System.out.println(ub.getLogin()+" ajouté avec succès.");
            System.out.println("Création du flux public");
            ps = connexion.prepareStatement("Insert into app.flux (id_utilisateur, estPublic, titreFlux, descriptionFlux) VALUES ("
                    +insertID+", "
                    +"1, "
                    +"'Flux public de "+ub.getLogin().replace("'","''")+"', "
                    +"'Nouvelles publiques')");
            ps.executeUpdate();
            ps.close();
            return insertID;
	}
	catch(Exception e){
	    e.printStackTrace();
	}
        return 0;
    }
    
    public void removeUtilisateur(int id) {
	try {
	    this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
	    PreparedStatement ps;
	    System.out.println("Suppresion de l'utilisateur " + id);
	    ps = connexion.prepareStatement("DELETE FROM app.utilisateurs WHERE id_utilisateur=" + id);
	    ps.executeUpdate();
	    System.out.println("Utilisateur " + id + " retiré avec succès.");
	    ps.close();
	} catch (Exception e) {
	    e.printStackTrace();
	}
    }
    
    public UtilisateurBean getByLogin(String login) {
        for (UtilisateurBean ub : this.getListeUtilisateurs()) {
            if(ub.getLogin().equalsIgnoreCase(login)){
                return ub;
            }
        }
        return null;
    }

    public UtilisateurBean getByID(int id) {
        for (UtilisateurBean ub : this.getListeUtilisateurs()) {
            if(ub.getId_utilisateur() == id){
                return ub;
            }
        }
        return null;
    }
    
    /**
     * Permet la modification d'un utilisateur. Change le mot de passe. 
     * @param id, sert à sélectionner l'utilisateur
     * @param nom
     * @param prenom
     * @param mail
     * @param mdp 
     */
    public void modifierUtilisateurByID(int id, String nom, String prenom, String mail, String mdp) {
	try {
	this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
	PreparedStatement ps;
	System.out.println("modification de "+id);
	ps = connexion.prepareStatement("Update app.utilisateurs set nomUtilisateur='"+nom+"',  prenomUtilisateur='"+prenom+"', mailUtilisateur='"+mail+"', mdpUtilisateur='"+mdp+"' where id_Utilisateur="+id);
	ps.executeUpdate();
	System.out.println(id+" modifié avec succès.");
	ps.close();
	}
	catch(Exception e){
	    e.printStackTrace();
	}
    }
    
    /**
     * Permet la modification d'un utilisateur. Ne change pas le mot de passe. 
     * @param id, sert à sélectionner l'utilisateur
     * @param nom
     * @param prenom
     * @param mail
     * @param mdp 
     */
    public void modifierUtilisateurByID(int id, String nom, String prenom, String mail) {
	try {
	this.connexion = driver.connect("jdbc:jdc:jdcpool", null);
	PreparedStatement ps;
	System.out.println("modification de "+id);
	ps = connexion.prepareStatement("Update app.utilisateurs set nomUtilisateur='"+nom+"',  prenomUtilisateur='"+prenom+"', mailUtilisateur='"+mail+"' where id_Utilisateur="+id);
	ps.executeUpdate();
	System.out.println(id+" modifié avec succès.");
	ps.close();
	}
	catch(Exception e){
	    e.printStackTrace();
	}
    }
}
